! function(e, a) {
  "object" == typeof exports && "object" == typeof module ? module.exports = a() : "function" == typeof define && define.amd ? define([], a) : "object" == typeof exports ? exports.DxfParser = a() : e.DxfParser = a()
}("undefined" != typeof self ? self : this, function() {
  return function(e) {
    var a = {};

    function t(r) {
      if (a[r]) return a[r].exports;
      var n = a[r] = {
        i: r,
        l: !1,
        exports: {}
      };
      return e[r].call(n.exports, n, n.exports, t), n.l = !0, n.exports
    }
    return t.m = e, t.c = a, t.d = function(e, a, r) {
      t.o(e, a) || Object.defineProperty(e, a, {
        enumerable: !0,
        get: r
      })
    }, t.r = function(e) {
      "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
        value: "Module"
      }), Object.defineProperty(e, "__esModule", {
        value: !0
      })
    }, t.t = function(e, a) {
      if (1 & a && (e = t(e)), 8 & a) return e;
      if (4 & a && "object" == typeof e && e && e.__esModule) return e;
      var r = Object.create(null);
      if (t.r(r), Object.defineProperty(r, "default", {
          enumerable: !0,
          value: e
        }), 2 & a && "string" != typeof e)
        for (var n in e) t.d(r, n, function(a) {
          return e[a]
        }.bind(null, n));
      return r
    }, t.n = function(e) {
      var a = e && e.__esModule ? function() {
        return e.default
      } : function() {
        return e
      };
      return t.d(a, "a", a), a
    }, t.o = function(e, a) {
      return Object.prototype.hasOwnProperty.call(e, a)
    }, t.p = "", t(t.s = 1)
  }([function(e, a, t) {
    var r, n;
    ! function(o, c) {
      "use strict";
      void 0 === (n = "function" == typeof(r = function() {
        var e = function() {},
          a = "undefined",
          t = ["trace", "debug", "info", "warn", "error"];

        function r(e, a) {
          var t = e[a];
          if ("function" == typeof t.bind) return t.bind(e);
          try {
            return Function.prototype.bind.call(t, e)
          } catch (a) {
            return function() {
              return Function.prototype.apply.apply(t, [e, arguments])
            }
          }
        }

        function n(a, r) {
          for (var n = 0; n < t.length; n++) {
            var o = t[n];
            this[o] = n < a ? e : this.methodFactory(o, a, r)
          }
          this.log = this.debug
        }

        function o(t, o, c) {
          return function(t) {
            "debug" === t && (t = "log");
            return typeof console !== a && (void 0 !== console[t] ? r(console, t) : void 0 !== console.log ? r(console, "log") : e)
          }(t) || function(e, t, r) {
            return function() {
              typeof console !== a && (n.call(this, t, r), this[e].apply(this, arguments))
            }
          }.apply(this, arguments)
        }

        function c(e, r, c) {
          var i, u = this,
            s = "loglevel";

          function l() {
            var e;
            if (typeof window !== a) {
              try {
                e = window.localStorage[s]
              } catch (e) {}
              if (typeof e === a) try {
                var t = window.document.cookie,
                  r = t.indexOf(encodeURIComponent(s) + "="); - 1 !== r && (e = /^([^;]+)/.exec(t.slice(r))[1])
              } catch (e) {}
              return void 0 === u.levels[e] && (e = void 0), e
            }
          }
          e && (s += ":" + e), u.name = e, u.levels = {
            TRACE: 0,
            DEBUG: 1,
            INFO: 2,
            WARN: 3,
            ERROR: 4,
            SILENT: 5
          }, u.methodFactory = c || o, u.getLevel = function() {
            return i
          }, u.setLevel = function(r, o) {
            if ("string" == typeof r && void 0 !== u.levels[r.toUpperCase()] && (r = u.levels[r.toUpperCase()]), !("number" == typeof r && r >= 0 && r <= u.levels.SILENT)) throw "log.setLevel() called with invalid level: " + r;
            if (i = r, !1 !== o && function(e) {
                var r = (t[e] || "silent").toUpperCase();
                if (typeof window === a) return;
                try {
                  return void(window.localStorage[s] = r)
                } catch (e) {}
                try {
                  window.document.cookie = encodeURIComponent(s) + "=" + r + ";"
                } catch (e) {}
              }(r), n.call(u, r, e), typeof console === a && r < u.levels.SILENT) return "No console available for logging"
          }, u.setDefaultLevel = function(e) {
            l() || u.setLevel(e, !1)
          }, u.enableAll = function(e) {
            u.setLevel(u.levels.TRACE, e)
          }, u.disableAll = function(e) {
            u.setLevel(u.levels.SILENT, e)
          };
          var v = l();
          null == v && (v = null == r ? "WARN" : r), u.setLevel(v, !1)
        }
        var i = new c,
          u = {};
        i.getLogger = function(e) {
          if ("string" != typeof e || "" === e) throw new TypeError("You must supply a name when creating a logger.");
          var a = u[e];
          return a || (a = u[e] = new c(e, i.getLevel(), i.methodFactory)), a
        };
        var s = typeof window !== a ? window.log : void 0;
        return i.noConflict = function() {
          return typeof window !== a && window.log === i && (window.log = s), i
        }, i.getLoggers = function() {
          return u
        }, i
      }) ? r.call(a, t, a, e) : r) || (e.exports = n)
    }()
  }, function(e, a, t) {
    "use strict";

    function r(e) {
      this._pointer = 0, this._data = e, this._eof = !1
    }

    function n(e, a) {
      return e <= 9 ? a : e >= 10 && e <= 59 ? parseFloat(a) : e >= 60 && e <= 99 ? parseInt(a) : e >= 100 && e <= 109 ? a : e >= 110 && e <= 149 ? parseFloat(a) : e >= 160 && e <= 179 ? parseInt(a) : e >= 210 && e <= 239 ? parseFloat(a) : e >= 270 && e <= 289 ? parseInt(a) : e >= 290 && e <= 299 ? function(e) {
        if ("0" === e) return !1;
        if ("1" === e) return !0;
        throw TypeError("String '" + e + "' cannot be cast to Boolean type")
      }(a) : e >= 300 && e <= 369 ? a : e >= 370 && e <= 389 ? parseInt(a) : e >= 390 && e <= 399 ? a : e >= 400 && e <= 409 ? parseInt(a) : e >= 410 && e <= 419 ? a : e >= 420 && e <= 429 ? parseInt(a) : e >= 430 && e <= 439 ? a : e >= 440 && e <= 459 ? parseInt(a) : e >= 460 && e <= 469 ? parseFloat(a) : e >= 470 && e <= 481 ? a : 999 === e ? a : e >= 1e3 && e <= 1009 ? a : e >= 1010 && e <= 1059 ? parseFloat(a) : e >= 1060 && e <= 1071 ? parseInt(a) : (console.log("WARNING: Group code does not have a defined type: %j", {
        code: e,
        value: a
      }), a)
    }
    t.r(a), r.prototype.next = function() {
      var e;
      if (!this.hasNext()) throw this._eof ? new Error("Cannot call 'next' after EOF group has been read") : new Error("Unexpected end of input: EOF group not read before end of file. Ended on code " + this._data[this._pointer]);
      return e = {
        code: parseInt(this._data[this._pointer])
      }, this._pointer++, e.value = n(e.code, this._data[this._pointer].trim()), this._pointer++, 0 === e.code && "EOF" === e.value && (this._eof = !0), this.lastReadGroup = e, e
    }, r.prototype.peek = function() {
      if (!this.hasNext()) throw this._eof ? new Error("Cannot call 'next' after EOF group has been read") : new Error("Unexpected end of input: EOF group not read before end of file. Ended on code " + this._data[this._pointer]);
      var e = {
        code: parseInt(this._data[this._pointer])
      };
      return e.value = n(e.code, this._data[this._pointer + 1].trim()), e
    }, r.prototype.rewind = function(e) {
      e = e || 1, this._pointer = this._pointer - 2 * e
    }, r.prototype.hasNext = function() {
      return !this._eof && !(this._pointer > this._data.length - 2)
    }, r.prototype.isEOF = function() {
      return this._eof
    };
    var o = [0, 16711680, 16776960, 65280, 65535, 255, 16711935, 16777215, 8421504, 12632256, 16711680, 16744319, 13369344, 13395558, 10027008, 10046540, 8323072, 8339263, 4980736, 4990502, 16727808, 16752511, 13382400, 13401958, 10036736, 10051404, 8331008, 8343359, 4985600, 4992806, 16744192, 16760703, 13395456, 13408614, 10046464, 10056268, 8339200, 8347455, 4990464, 4995366, 16760576, 16768895, 13408512, 13415014, 10056192, 10061132, 8347392, 8351551, 4995328, 4997670, 16776960, 16777087, 13421568, 13421670, 10000384, 10000460, 8355584, 8355647, 5000192, 5000230, 12582656, 14679935, 10079232, 11717734, 7510016, 8755276, 6258432, 7307071, 3755008, 4344870, 8388352, 12582783, 6736896, 10079334, 5019648, 7510092, 4161280, 6258495, 2509824, 3755046, 4194048, 10485631, 3394560, 8375398, 2529280, 6264908, 2064128, 5209919, 1264640, 3099686, 65280, 8388479, 52224, 6736998, 38912, 5019724, 32512, 4161343, 19456, 2509862, 65343, 8388511, 52275, 6737023, 38950, 5019743, 32543, 4161359, 19475, 2509871, 65407, 8388543, 52326, 6737049, 38988, 5019762, 32575, 4161375, 19494, 2509881, 65471, 8388575, 52377, 6737074, 39026, 5019781, 32607, 4161391, 19513, 2509890, 65535, 8388607, 52428, 6737100, 39064, 5019800, 32639, 4161407, 19532, 2509900, 49151, 8380415, 39372, 6730444, 29336, 5014936, 24447, 4157311, 14668, 2507340, 32767, 8372223, 26316, 6724044, 19608, 5010072, 16255, 4153215, 9804, 2505036, 16383, 8364031, 13260, 6717388, 9880, 5005208, 8063, 4149119, 4940, 2502476, 255, 8355839, 204, 6710988, 152, 5000344, 127, 4145023, 76, 2500172, 4129023, 10452991, 3342540, 8349388, 2490520, 6245528, 2031743, 5193599, 1245260, 3089996, 8323327, 12550143, 6684876, 10053324, 4980888, 7490712, 4128895, 6242175, 2490444, 3745356, 12517631, 14647295, 10027212, 11691724, 7471256, 8735896, 6226047, 7290751, 3735628, 4335180, 16711935, 16744447, 13369548, 13395660, 9961624, 9981080, 8323199, 8339327, 4980812, 4990540, 16711871, 16744415, 13369497, 13395634, 9961586, 9981061, 8323167, 8339311, 4980793, 4990530, 16711807, 16744383, 13369446, 13395609, 9961548, 9981042, 8323135, 8339295, 4980774, 4990521, 16711743, 16744351, 13369395, 13395583, 9961510, 9981023, 8323103, 8339279, 4980755, 4990511, 3355443, 5987163, 8684676, 11382189, 14079702, 16777215];

    function c(e) {
      var a = {};
      e.rewind();
      var t = e.next(),
        r = t.code;
      if (a.x = t.value, r += 10, (t = e.next()).code != r) throw new Error("Expected code for point value to be " + r + " but got " + t.code + ".");
      return a.y = t.value, r += 10, (t = e.next()).code != r ? (e.rewind(), a) : (a.z = t.value, a)
    }

    function i(e, a) {
      switch (a.code) {
        case 0:
          e.type = a.value;
          break;
        case 5:
          e.handle = a.value;
          break;
        case 6:
          e.lineType = a.value;
          break;
        case 8:
          e.layer = a.value;
          break;
        case 48:
          e.lineTypeScale = a.value;
          break;
        case 60:
          e.visible = 0 === a.value;
          break;
        case 62:
          e.colorIndex = a.value, e.color = (t = Math.abs(a.value), o[t]);
          break;
        case 67:
          e.inPaperSpace = 0 !== a.value;
          break;
        case 100:
          break;
        case 330:
          e.ownerHandle = a.value;
          break;
        case 347:
          e.materialObjectHandle = a.value;
          break;
        case 370:
          e.lineweight = a.value;
          break;
        case 420:
          e.color = a.value;
          break;
        case 1e3:
          e.extendedData = e.extendedData || {}, e.extendedData.customStrings = e.extendedData.customStrings || [], e.extendedData.customStrings.push(a.value);
          break;
        case 1001:
          e.extendedData = e.extendedData || {}, e.extendedData.applicationName = a.value;
          break;
        default:
          return !1
      }
      var t;
      return !0
    }

    function u() {}

    function s(e, a) {
      var t, r = [],
        n = !1,
        o = !1;
      for (t = 0; t <= 4; t++) {
        for (var c = {};
          "EOF" !== a && 0 !== a.code && !o;) {
          switch (a.code) {
            case 10:
            case 11:
            case 12:
            case 13:
              if (n) {
                o = !0;
                continue
              }
              c.x = a.value, n = !0;
              break;
            case 20:
            case 21:
            case 22:
            case 23:
              c.y = a.value;
              break;
            case 30:
            case 31:
            case 32:
            case 33:
              c.z = a.value;
              break;
            default:
              return r
          }
          a = e.next()
        }
        r.push(c), n = !1, o = !1
      }
      return e.rewind(), r
    }

    function l() {}

    function v() {}

    function d() {}

    function b() {}

    function p() {}

    function f() {}

    function k() {}

    function y() {}

    function x(e, a) {
      if (!e || e <= 0) throw Error("n must be greater than 0 verticies");
      var t, r = [],
        n = !1,
        o = !1,
        c = a.lastReadGroup;
      for (t = 0; t < e; t++) {
        for (var i = {};
          "EOF" !== c && 0 !== c.code && !o;) {
          switch (c.code) {
            case 10:
              if (n) {
                o = !0;
                continue
              }
              i.x = c.value, n = !0;
              break;
            case 20:
              i.y = c.value;
              break;
            case 30:
              i.z = c.value;
              break;
            case 40:
              i.startWidth = c.value;
              break;
            case 41:
              i.endWidth = c.value;
              break;
            case 42:
              0 != c.value && (i.bulge = c.value);
              break;
            default:
              return n && r.push(i), r
          }
          c = a.next()
        }
        r.push(i), n = !1, o = !1
      }
      return a.rewind(), r
    }

    function h() {}

    function g() {}

    function E() {}

    function w() {}

    function m(e, a) {
      var t = {
        type: a.value
      };
      for (a = e.next();
        "EOF" != a && 0 != a.code;) i(t, a), a = e.next();
      return t
    }

    function P() {}

    function F() {}

    function O() {}
    u.ForEntityName = "3DFACE", u.prototype.parseEntity = function(e, a) {
      var t = {
        type: a.value,
        vertices: []
      };
      for (a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 70:
            t.shape = 1 == (1 & a.value), t.hasContinuousLinetypePattern = 128 == (128 & a.value);
            break;
          case 10:
            t.vertices = s(e, a), a = e.lastReadGroup;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, l.ForEntityName = "ARC", l.prototype.parseEntity = function(e, a) {
      var t;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.center = c(e);
            break;
          case 40:
            t.radius = a.value;
            break;
          case 50:
            t.startAngle = Math.PI / 180 * a.value;
            break;
          case 51:
            t.endAngle = Math.PI / 180 * a.value, t.angleLength = t.endAngle - t.startAngle;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, v.ForEntityName = "ATTDEF", v.prototype.parseEntity = function(e, a) {
      var t = {
        type: a.value,
        scale: 1,
        textStyle: "STANDARD"
      };
      for (a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 1:
            t.text = a.value;
            break;
          case 2:
            t.tag = a.value;
            break;
          case 3:
            t.prompt = a.value;
            break;
          case 7:
            t.textStyle = a.value;
            break;
          case 10:
            t.startPoint = c(e);
            break;
          case 11:
            t.endPoint = c(e);
            break;
          case 39:
            t.thickness = a.value;
            break;
          case 40:
            t.textHeight = a.value;
            break;
          case 41:
            t.scale = a.value;
            break;
          case 50:
            t.rotation = a.value;
            break;
          case 51:
            t.obliqueAngle = a.value;
            break;
          case 70:
            t.invisible = !!(1 & a.value), t.constant = !!(2 & a.value), t.verificationRequired = !!(4 & a.value), t.preset = !!(8 & a.value);
            break;
          case 71:
            t.backwards = !!(2 & a.value), t.mirrored = !!(4 & a.value);
            break;
          case 72:
            t.horizontalJustification = a.value;
            break;
          case 73:
            t.fieldLength = a.value;
            break;
          case 74:
            t.verticalJustification = a.value;
            break;
          case 100:
            break;
          case 210:
            t.extrusionDirectionX = a.value;
            break;
          case 220:
            t.extrusionDirectionY = a.value;
            break;
          case 230:
            t.extrusionDirectionZ = a.value;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, d.ForEntityName = "CIRCLE", d.prototype.parseEntity = function(e, a) {
      var t, r;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.center = c(e);
            break;
          case 40:
            t.radius = a.value;
            break;
          case 50:
            t.startAngle = Math.PI / 180 * a.value;
            break;
          case 51:
            (r = Math.PI / 180 * a.value) < t.startAngle ? t.angleLength = r + 2 * Math.PI - t.startAngle : t.angleLength = r - t.startAngle, t.endAngle = r;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, b.ForEntityName = "DIMENSION", b.prototype.parseEntity = function(e, a) {
      var t;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 2:
            t.block = a.value;
            break;
          case 10:
            t.anchorPoint = c(e);
            break;
          case 11:
            t.middleOfText = c(e);
            break;
          case 12:
            t.insertionPoint = c(e);
            break;
          case 13:
            t.linearOrAngularPoint1 = c(e);
            break;
          case 14:
            t.linearOrAngularPoint2 = c(e);
            break;
          case 15:
            t.diameterOrRadiusPoint = c(e);
            break;
          case 16:
            t.arcPoint = c(e);
            break;
          case 70:
            t.dimensionType = a.value;
            break;
          case 71:
            t.attachmentPoint = a.value;
            break;
          case 42:
            t.actualMeasurement = a.value;
            break;
          case 1:
            t.text = a.value;
            break;
          case 50:
            t.angle = a.value;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, p.ForEntityName = "ELLIPSE", p.prototype.parseEntity = function(e, a) {
      var t;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.center = c(e);
            break;
          case 11:
            t.majorAxisEndPoint = c(e);
            break;
          case 40:
            t.axisRatio = a.value;
            break;
          case 41:
            t.startAngle = a.value;
            break;
          case 42:
            t.endAngle = a.value;
            break;
          case 2:
            t.name = a.value;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, f.ForEntityName = "INSERT", f.prototype.parseEntity = function(e, a) {
      var t;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 2:
            t.name = a.value;
            break;
          case 41:
            t.xScale = a.value;
            break;
          case 42:
            t.yScale = a.value;
            break;
          case 43:
            t.zScale = a.value;
            break;
          case 10:
            t.position = c(e);
            break;
          case 50:
            t.rotation = a.value;
            break;
          case 70:
            t.columnCount = a.value;
            break;
          case 71:
            t.rowCount = a.value;
            break;
          case 44:
            t.columnSpacing = a.value;
            break;
          case 45:
            t.rowSpacing = a.value;
            break;
          case 210:
            t.extrusionDirection = c(e);
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, k.ForEntityName = "LINE", k.prototype.parseEntity = function(e, a) {
      var t = {
        type: a.value,
        vertices: []
      };
      for (a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.vertices.unshift(c(e));
            break;
          case 11:
            t.vertices.push(c(e));
            break;
          case 210:
            t.extrusionDirection = c(e);
            break;
          case 100:
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, y.ForEntityName = "LWPOLYLINE", y.prototype.parseEntity = function(e, a) {
      var t = {
          type: a.value,
          vertices: []
        },
        r = 0;
      for (a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 38:
            t.elevation = a.value;
            break;
          case 39:
            t.depth = a.value;
            break;
          case 70:
            t.shape = 1 == (1 & a.value), t.hasContinuousLinetypePattern = 128 == (128 & a.value);
            break;
          case 90:
            r = a.value;
            break;
          case 10:
            t.vertices = x(r, e);
            break;
          case 43:
            0 !== a.value && (t.width = a.value);
            break;
          case 210:
            t.extrusionDirectionX = a.value;
            break;
          case 220:
            t.extrusionDirectionY = a.value;
            break;
          case 230:
            t.extrusionDirectionZ = a.value;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, h.ForEntityName = "MTEXT", h.prototype.parseEntity = function(e, a) {
      var t = {
        type: a.value
      };
      for (a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 3:
          case 1:
            t.text ? t.text += a.value : t.text = a.value;
            break;
          case 10:
            t.position = c(e);
            break;
          case 40:
            t.height = a.value;
            break;
          case 41:
            t.width = a.value;
            break;
          case 50:
            t.rotation = a.value;
            break;
          case 71:
            t.attachmentPoint = a.value;
            break;
          case 72:
            t.drawingDirection = a.value;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, g.ForEntityName = "POINT", g.prototype.parseEntity = function(e, a) {
      var t;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.position = c(e);
            break;
          case 39:
            t.thickness = a.value;
            break;
          case 210:
            t.extrusionDirection = c(e);
            break;
          case 100:
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, E.ForEntityName = "VERTEX", E.prototype.parseEntity = function(e, a) {
      var t = {
        type: a.value
      };
      for (a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.x = a.value;
            break;
          case 20:
            t.y = a.value;
            break;
          case 30:
            t.z = a.value;
            break;
          case 40:
          case 41:
          case 42:
            0 != a.value && (t.bulge = a.value);
            break;
          case 70:
            t.curveFittingVertex = 0 != (1 & a.value), t.curveFitTangent = 0 != (2 & a.value), t.splineVertex = 0 != (8 & a.value), t.splineControlPoint = 0 != (16 & a.value), t.threeDPolylineVertex = 0 != (32 & a.value), t.threeDPolylineMesh = 0 != (64 & a.value), t.polyfaceMeshVertex = 0 != (128 & a.value);
            break;
          case 50:
          case 71:
            t.faceA = a.value;
            break;
          case 72:
            t.faceB = a.value;
            break;
          case 73:
            t.faceC = a.value;
            break;
          case 74:
            t.faceD = a.value;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, w.ForEntityName = "POLYLINE", w.prototype.parseEntity = function(e, a) {
      var t = {
        type: a.value,
        vertices: []
      };
      for (a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
          case 20:
          case 30:
          case 39:
            t.thickness = a.value;
            break;
          case 40:
          case 41:
            break;
          case 70:
            t.shape = 0 != (1 & a.value), t.includesCurveFitVertices = 0 != (2 & a.value), t.includesSplineFitVertices = 0 != (4 & a.value), t.is3dPolyline = 0 != (8 & a.value), t.is3dPolygonMesh = 0 != (16 & a.value), t.is3dPolygonMeshClosed = 0 != (32 & a.value), t.isPolyfaceMesh = 0 != (64 & a.value), t.hasContinuousLinetypePattern = 0 != (128 & a.value);
            break;
          case 71:
          case 72:
          case 73:
          case 74:
          case 75:
            break;
          case 210:
            t.extrusionDirection = c(e);
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t.vertices = function(e, a) {
        var t = new E,
          r = [];
        for (; !e.isEOF();)
          if (0 === a.code)
            if ("VERTEX" === a.value) r.push(t.parseEntity(e, a)), a = e.lastReadGroup;
            else if ("SEQEND" === a.value) {
          m(e, a);
          break
        }
        return r
      }(e, a), t
    }, P.ForEntityName = "SOLID", P.prototype.parseEntity = function(e, a) {
      var t;
      for ((t = {
          type: a.value
        }).points = [], a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.points[0] = c(e);
            break;
          case 11:
            t.points[1] = c(e);
            break;
          case 12:
            t.points[2] = c(e);
            break;
          case 13:
            t.points[3] = c(e);
            break;
          case 210:
            t.extrusionDirection = c(e);
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, F.ForEntityName = "SPLINE", F.prototype.parseEntity = function(e, a) {
      var t;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.controlPoints || (t.controlPoints = []), t.controlPoints.push(c(e));
            break;
          case 11:
            t.fitPoints || (t.fitPoints = []), t.fitPoints.push(c(e));
            break;
          case 12:
            t.startTangent = c(e);
            break;
          case 13:
            t.endTangent = c(e);
            break;
          case 40:
            t.knotValues || (t.knotValues = []), t.knotValues.push(a.value);
            break;
          case 70:
            0 != (1 & a.value) && (t.closed = !0), 0 != (2 & a.value) && (t.periodic = !0), 0 != (4 & a.value) && (t.rational = !0), 0 != (8 & a.value) && (t.planar = !0), 0 != (16 & a.value) && (t.planar = !0, t.linear = !0);
            break;
          case 71:
            t.degreeOfSplineCurve = a.value;
            break;
          case 72:
            t.numberOfKnots = a.value;
            break;
          case 73:
            t.numberOfControlPoints = a.value;
            break;
          case 74:
            t.numberOfFitPoints = a.value;
            break;
          case 210:
            t.normalVector = c(e);
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    }, O.ForEntityName = "TEXT", O.prototype.parseEntity = function(e, a) {
      var t;
      for (t = {
          type: a.value
        }, a = e.next();
        "EOF" !== a && 0 !== a.code;) {
        switch (a.code) {
          case 10:
            t.startPoint = c(e);
            break;
          case 11:
            t.endPoint = c(e);
            break;
          case 40:
            t.textHeight = a.value;
            break;
          case 41:
            t.xScale = a.value;
            break;
          case 50:
            t.rotation = a.value;
            break;
          case 1:
            t.text = a.value;
            break;
          case 72:
            t.halign = a.value;
            break;
          case 73:
            t.valign = a.value;
            break;
          default:
            i(t, a)
        }
        a = e.next()
      }
      return t
    };
    var N = t(0);

    function T() {
      var e;
      this._entityHandlers = {}, (e = this).registerEntityHandler(u), e.registerEntityHandler(l), e.registerEntityHandler(v), e.registerEntityHandler(d), e.registerEntityHandler(b), e.registerEntityHandler(p), e.registerEntityHandler(f), e.registerEntityHandler(k), e.registerEntityHandler(y), e.registerEntityHandler(h), e.registerEntityHandler(g), e.registerEntityHandler(w), e.registerEntityHandler(P), e.registerEntityHandler(F), e.registerEntityHandler(O)
    }

    function S(e) {
      N.debug("unhandled group " + L(e))
    }

    function L(e) {
      return e.code + ":" + e.value
    }
    N.setLevel("error"), T.prototype.parse = function(e, a) {
      throw new Error("read() not implemented. Use readSync()")
    }, T.prototype.registerEntityHandler = function(e) {
      var a = new e;
      this._entityHandlers[e.ForEntityName] = a
    }, T.prototype.parseSync = function(e) {
      return "string" == typeof e ? this._parse(e) : (console.error("Cannot read dxf source of type `" + typeof e), null)
    }, T.prototype.parseStream = function(e, a) {
      var t = "",
        r = this;
      e.on("data", function(e) {
        t += e
      }), e.on("end", function() {
        try {
          var e = r._parse(t)
        } catch (e) {
          return a(e)
        }
        a(null, e)
      }), e.on("error", function(e) {
        a(e)
      })
    }, T.prototype._parse = function(e) {
      var a, t, n = {},
        c = 0,
        i = e.split(/\r\n|\r|\n/g);
      if (!(a = new r(i)).hasNext()) throw Error("Empty file");
      var u = this,
        s = function(e, a) {
          return t.code === e && t.value === a
        },
        l = function() {
          var e = null,
            r = null,
            n = {};
          for (t = a.next();;) {
            if (s(0, "ENDSEC")) {
              e && (n[e] = r);
              break
            }
            9 === t.code ? (e && (n[e] = r), e = t.value) : 10 === t.code ? r = {
              x: t.value
            } : 20 === t.code ? r.y = t.value : 30 === t.code ? r.z = t.value : r = t.value, t = a.next()
          }
          return t = a.next(), n
        },
        v = function() {
          var e, r = {};
          for (t = a.next();
            "EOF" !== t.value && !s(0, "ENDSEC");) s(0, "BLOCK") ? (N.debug("block {"), e = d(), N.debug("}"), x(e), e.name ? r[e.name] = e : N.error('block with handle "' + e.handle + '" is missing a name.')) : (S(t), t = a.next());
          return r
        },
        d = function() {
          var e = {};
          for (t = a.next();
            "EOF" !== t.value;) {
            switch (t.code) {
              case 1:
                e.xrefPath = t.value, t = a.next();
                break;
              case 2:
                e.name = t.value, t = a.next();
                break;
              case 3:
                e.name2 = t.value, t = a.next();
                break;
              case 5:
                e.handle = t.value, t = a.next();
                break;
              case 8:
                e.layer = t.value, t = a.next();
                break;
              case 10:
                e.position = y(), t = a.next();
                break;
              case 67:
                e.paperSpace = !(!t.value || 1 != t.value), t = a.next();
                break;
              case 70:
                0 != t.value && (e.type = t.value), t = a.next();
                break;
              case 100:
                t = a.next();
                break;
              case 330:
                e.ownerHandle = t.value, t = a.next();
                break;
              case 0:
                if ("ENDBLK" == t.value) break;
                e.entities = k(!0);
                break;
              default:
                S(t), t = a.next()
            }
            if (s(0, "ENDBLK")) {
              t = a.next();
              break
            }
          }
          return e
        },
        b = function() {
          var e = {};
          for (t = a.next();
            "EOF" !== t.value && !s(0, "ENDSEC");) {
            s(0, "TABLE") ? (t = a.next(), f[t.value] ? (N.debug(t.value + " Table {"), e[f[t.value].tableName] = p(), N.debug("}")) : N.debug("Unhandled Table " + t.value)) : t = a.next()
          }
          return t = a.next(), e
        };
      var p = function() {
          var e, r = f[t.value],
            n = {},
            o = 0;
          for (t = a.next(); !s(0, "ENDTAB");) switch (t.code) {
            case 5:
              n.handle = t.value, t = a.next();
              break;
            case 330:
              n.ownerHandle = t.value, t = a.next();
              break;
            case 100:
              "AcDbSymbolTable" === t.value ? t = a.next() : (S(t), t = a.next());
              break;
            case 70:
              o = t.value, t = a.next();
              break;
            case 0:
              t.value === r.dxfSymbolName ? n[r.tableRecordsProperty] = r.parseTableRecords() : (S(t), t = a.next());
              break;
            default:
              S(t), t = a.next()
          }
          var c = n[r.tableRecordsProperty];
          return c && (c.constructor === Array ? e = c.length : "object" == typeof c && (e = Object.keys(c).length), o !== e && N.warn("Parsed " + e + " " + r.dxfSymbolName + "'s but expected " + o)), t = a.next(), n
        },
        f = {
          VPORT: {
            tableRecordsProperty: "viewPorts",
            tableName: "viewPort",
            dxfSymbolName: "VPORT",
            parseTableRecords: function() {
              var e = [],
                r = {};
              for (N.debug("ViewPort {"), t = a.next(); !s(0, "ENDTAB");) switch (t.code) {
                case 2:
                  r.name = t.value, t = a.next();
                  break;
                case 10:
                  r.lowerLeftCorner = y(), t = a.next();
                  break;
                case 11:
                  r.upperRightCorner = y(), t = a.next();
                  break;
                case 12:
                  r.center = y(), t = a.next();
                  break;
                case 13:
                  r.snapBasePoint = y(), t = a.next();
                  break;
                case 14:
                  r.snapSpacing = y(), t = a.next();
                  break;
                case 15:
                  r.gridSpacing = y(), t = a.next();
                  break;
                case 16:
                  r.viewDirectionFromTarget = y(), t = a.next();
                  break;
                case 17:
                  r.viewTarget = y(), t = a.next();
                  break;
                case 42:
                  r.lensLength = t.value, t = a.next();
                  break;
                case 43:
                  r.frontClippingPlane = t.value, t = a.next();
                  break;
                case 44:
                  r.backClippingPlane = t.value, t = a.next();
                  break;
                case 45:
                  r.viewHeight = t.value, t = a.next();
                  break;
                case 50:
                  r.snapRotationAngle = t.value, t = a.next();
                  break;
                case 51:
                  r.viewTwistAngle = t.value, t = a.next();
                  break;
                case 79:
                  r.orthographicType = t.value, t = a.next();
                  break;
                case 110:
                  r.ucsOrigin = y(), t = a.next();
                  break;
                case 111:
                  r.ucsXAxis = y(), t = a.next();
                  break;
                case 112:
                  r.ucsYAxis = y(), t = a.next();
                  break;
                case 110:
                  r.ucsOrigin = y(), t = a.next();
                  break;
                case 281:
                  r.renderMode = t.value, t = a.next();
                  break;
                case 281:
                  r.defaultLightingType = t.value, t = a.next();
                  break;
                case 292:
                  r.defaultLightingOn = t.value, t = a.next();
                  break;
                case 330:
                  r.ownerHandle = t.value, t = a.next();
                  break;
                case 63:
                case 421:
                case 431:
                  r.ambientColor = t.value, t = a.next();
                  break;
                case 0:
                  "VPORT" === t.value && (N.debug("}"), e.push(r), N.debug("ViewPort {"), r = {}, t = a.next());
                  break;
                default:
                  S(t), t = a.next()
              }
              return N.debug("}"), e.push(r), e
            }
          },
          LTYPE: {
            tableRecordsProperty: "lineTypes",
            tableName: "lineType",
            dxfSymbolName: "LTYPE",
            parseTableRecords: function() {
              var e, r, n = {},
                o = {};
              for (N.debug("LType {"), t = a.next(); !s(0, "ENDTAB");) switch (t.code) {
                case 2:
                  o.name = t.value, e = t.value, t = a.next();
                  break;
                case 3:
                  o.description = t.value, t = a.next();
                  break;
                case 73:
                  (r = t.value) > 0 && (o.pattern = []), t = a.next();
                  break;
                case 40:
                  o.patternLength = t.value, t = a.next();
                  break;
                case 49:
                  o.pattern.push(t.value), t = a.next();
                  break;
                case 0:
                  N.debug("}"), r > 0 && r !== o.pattern.length && N.warn("lengths do not match on LTYPE pattern"), n[e] = o, o = {}, N.debug("LType {"), t = a.next();
                  break;
                default:
                  t = a.next()
              }
              return N.debug("}"), n[e] = o, n
            }
          },
          LAYER: {
            tableRecordsProperty: "layers",
            tableName: "layer",
            dxfSymbolName: "LAYER",
            parseTableRecords: function() {
              var e, r, n = {},
                c = {};
              for (N.debug("Layer {"), t = a.next(); !s(0, "ENDTAB");) switch (t.code) {
                case 2:
                  c.name = t.value, e = t.value, t = a.next();
                  break;
                case 62:
                  c.visible = t.value >= 0, c.colorIndex = Math.abs(t.value), c.color = (r = c.colorIndex, o[r]), t = a.next();
                  break;
                case 70:
                  c.frozen = 0 != (1 & t.value) || 0 != (2 & t.value), t = a.next();
                  break;
                case 0:
                  "LAYER" === t.value && (N.debug("}"), n[e] = c, N.debug("Layer {"), c = {}, e = void 0, t = a.next());
                  break;
                default:
                  S(t), t = a.next()
              }
              return N.debug("}"), n[e] = c, n
            }
          }
        },
        k = function(e) {
          var r = [],
            n = e ? "ENDBLK" : "ENDSEC";
          for (e || (t = a.next());;)
            if (0 === t.code) {
              if (t.value === n) break;
              var o, c = u._entityHandlers[t.value];
              if (null == c) {
                N.warn("Unhandled entity " + t.value), t = a.next();
                continue
              }
              N.debug(t.value + " {"), o = c.parseEntity(a, t), t = a.lastReadGroup, N.debug("}"), x(o), r.push(o)
            } else t = a.next();
          return "ENDSEC" == n && (t = a.next()), r
        },
        y = function() {
          var e = {},
            r = t.code;
          if (e.x = t.value, r += 10, (t = a.next()).code != r) throw new Error("Expected code for point value to be " + r + " but got " + t.code + ".");
          return e.y = t.value, r += 10, (t = a.next()).code != r ? (a.rewind(), e) : (e.z = t.value, e)
        },
        x = function(e) {
          if (!e) throw new TypeError("entity cannot be undefined or null");
          e.handle || (e.handle = c++)
        };
      return function() {
        for (t = a.next(); !a.isEOF();)
          if (0 === t.code && "SECTION" === t.value) {
            if (2 !== (t = a.next()).code) {
              console.error("Unexpected code %s after 0:SECTION", L(t)), t = a.next();
              continue
            }
            "HEADER" === t.value ? (N.debug("> HEADER"), n.header = l(), N.debug("<")) : "BLOCKS" === t.value ? (N.debug("> BLOCKS"), n.blocks = v(), N.debug("<")) : "ENTITIES" === t.value ? (N.debug("> ENTITIES"), n.entities = k(!1), N.debug("<")) : "TABLES" === t.value ? (N.debug("> TABLES"), n.tables = b(), N.debug("<")) : "EOF" === t.value ? N.debug("EOF") : N.warn("Skipping section '%s'", t.value)
          } else t = a.next()
      }(), n
    };
    a.default = T
  }]).default
});